/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Server.Helper;

import Server.SQL.CommandType;
import Server.SQL.SQLKeyWords;
import java.util.Locale;

/**
 *
 * @author Gnoc
 */

/*
 * Lớp helper giúp đỡ việc phân tích loại command, cú pháp command.
 * Phân tích và trả về các đối số trong mỗi loại câu lệnh.
*/
public class Analyzer 
{
    /*
     * Hàm thực hiện việc phân tích loại câu truy vấn.
     * Trả về loại của câu truy vấn đó.
     * Nếu không tìm được loại thì trả về loại UNKNOW.
     */
    public static CommandType AnalysisType(String cmd)
    {
        String[] strSplit = cmd.split(" ");
        
        try
        {
            return CommandType.valueOf(strSplit[0].toUpperCase());
        }
        catch (Exception e)
        {
            return CommandType.UNKNOW;
        }
    }
    
    /*
     * Hàm thực hiện việc chuẩn hóa câu lệnh sql.
     * Các từ khóa, toán tử đều được chuyển thành UpperCase, các từ còn lại giữ nguyên
     */
    public static String MakeCommandStandardization(String cmd)
    {
        String cmdStandardization = "";
        cmd = new Analyzer().StandardizationSign(cmd);
        // 
        String[] strTemp = cmd.split(" ");

        for(int i = 0;i <strTemp.length; i++)
        {
            try
            {
                SQLKeyWords key = SQLKeyWords.valueOf(strTemp[i].toUpperCase());
                cmdStandardization += key.name().toLowerCase() + " ";
            }
            catch(Exception e)
            {
                cmdStandardization += strTemp[i] + " ";
            }
        }
        cmdStandardization = new Analyzer().StandardizationSign(cmdStandardization);
        return cmdStandardization.trim();
    }
    
    public static String MakeCommandStandardization4InsertSelect(String cmd)
    {
        String cmdStandardization = "";
        // 
        String[] strTemp = cmd.split(" ");

        for(int i = 0;i <strTemp.length; i++)
        {
            try
            {
                SQLKeyWords key = SQLKeyWords.valueOf(strTemp[i].toUpperCase());
                cmdStandardization += key.name().toLowerCase() + " ";
            }
            catch(Exception e)
            {
                cmdStandardization += strTemp[i] + " ";
            }
        }
        return cmdStandardization.trim();
    }
    
    private static String StandardizationSign(String cmd)
    {
        // Cắt khoảng trắng sau dấu ,
        for(int i = 0; i<cmd.length()-1; i++)
        {
            if(cmd.charAt(i) == ',' && cmd.charAt(i+1) == ' ')
                cmd = cmd.substring(0, i + 1) + cmd.substring( i + 2, cmd.length());
        }
        // Cắt khoảng trắng sau dấu =
        for(int i = 0; i<cmd.length()-1; i++)
        {
            if(cmd.charAt(i) == '=' && cmd.charAt(i+1) == ' ')
                cmd = cmd.substring(0, i + 1) + cmd.substring( i + 2, cmd.length());
        }
        // Cắt khoảng trắng trước dấu =
        for(int i = 0; i<cmd.length()-1; i++)
        {
            if(cmd.charAt(i) == '=' && cmd.charAt(i-1) == ' ')
                cmd = cmd.substring(0, i-1) + cmd.substring( i , cmd.length());
        }
        
        // Thêm khoảng trắng sau (
        for(int i = 0; i<cmd.length() - 1; i++)
        {
            if(cmd.charAt(i) == '(' && cmd.charAt(i + 1) != ' ')
                cmd = cmd.substring(0, i + 1) + " " + cmd.substring(i+ 1 , cmd.length());
        }
        // Thêm khoảng trắng trước )
        for (int i=0; i<cmd.length() - 1; i++)
        {
            if(cmd.charAt(i) != ' ' && cmd.charAt(i + 1) == ')')
                cmd = cmd.substring(0, i + 1) + " " + cmd.substring(i+ 1 , cmd.length());
        }
        
        return cmd;
    }
    
    /*
     * Hàm thực hiện phân tích là câu lệnh sql cấp mấy.
     * trả về cấp của câu lệnh.
     */
    
    public static int AnalysisLevel(String cmd)
    {
        int level = 0;
        
        String[] strTemp = cmd.split(" ");
        for(int i = 0; i<strTemp.length; i++)
        {
            try{
                CommandType.valueOf(strTemp[i].toUpperCase());
                level ++;
            }
            catch(Exception e)
            {
                
            }
        }
        
        return level;
    }
}
